package cn.itsource.user.service.impl;

import cn.itsource.basic.SystemContents;
import cn.itsource.basic.service.impl.BaseServiceImpl;
import cn.itsource.basic.utils.AjaxResult;
import cn.itsource.basic.utils.HttpClientUtils;
import cn.itsource.basic.utils.RedisUtils;
import cn.itsource.user.contants.WxConfig;
import cn.itsource.user.domain.User;
import cn.itsource.user.domain.WxUser;
import cn.itsource.user.mapper.UserMapper;
import cn.itsource.user.mapper.WxUserMapper;
import cn.itsource.user.service.IWxUserService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class WxUserServiceImpl extends BaseServiceImpl<WxUser> implements IWxUserService {

    @Autowired
    private WxUserMapper wxUserMapper;
    @Autowired
    private UserMapper userMapper;


    @Override
    public AjaxResult wxLogin(String code){
        //通过code 换取access_token
        //1.发起get请求
        String resultStr = HttpClientUtils.httpGet(WxConfig.GET_TOKEN_URL.replace("APPID", WxConfig.APPID)
                .replace("SECRET", WxConfig.SECRET)
                .replace("CODE", code));
        //{"access_token":"40_A3rsMl7lfYCSIA6GWgSrmPjff769EDc9CvtnpgK9kFxzV0p5CQWPiInlrYUZR-7dzQl6hahENAjW8Ubf0OlWvmPhgUbx_a7LWBFGAE4PyQE","expires_in":7200,"refresh_token":"40_FBfOv7vgX9WgBgpP_4eK8hoWSezqW7bN3YvkikND3UgNAJoFqGFqf4SnMgJm2edgUp82RVDu7s1SxPhRdD0Jjn1_bTyyGPjY597rbCquIkI","openid":"oa9wA0_clwVQ6uUbZgkQ3MgzLnAg","scope":"snsapi_login","unionid":"ovnCWwwJ3S9h_pJ4Rcz_HecQ93BI"}
        JSONObject jsonObject = JSONObject.parseObject(resultStr);
        //通过key 获取value
        String access_token = jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

        /*
            1.用户第一次登录
                   获取微信用户的个人信息 ， 让用户绑定 手机号。

            2.用户已经登录过，但是没有绑定手机号。
                   跳转到绑定页面

            3.用户已经扫码登录过，也绑定了手机号。
                   登录成功（发放token,redis要存储）

         */

        //根据openid 获取微信的用户信息
        WxUser wxUser =wxUserMapper.queryByOpenId(openid);
        if (wxUser!=null&&wxUser.getUser()!=null){//直接登录
            String token = UUID.randomUUID().toString().replace('-', 'o');
            //java 对象  和 js  json对象如果可以转换
            String userJson = JSONObject.toJSONString(wxUser.getUser());

            //需要把当前的登录用户存储到redis
            RedisUtils.INSTANCE.set(token,userJson,60*30);
            System.out.println("存储到redis里面的用户："+token+"       "+userJson);

            //把票据 和 用户都给前端服务器
            Map<String,Object> returnMap = new HashMap<>();
            returnMap.put("token",token);
            returnMap.put("user",wxUser.getUser());
            return AjaxResult.me().setResultObj(returnMap);

        }else {//需要用户绑定手机号
            //再页面跳转的同时 携带参数
            String binderUrl = "/binder.html?openid="+openid+"&access_token="+access_token;

            return  new AjaxResult("绑定用户").setResultObj(binderUrl);
        }



    }

    @Override
    @Transactional
    public AjaxResult bind(Map<String,String> map) {
        String phone = map.get("phone");
        String code = map.get("code");
        String openid = map.get("openid");
        String access_token = map.get("access_token");

        //1.验证code是否正确
        String redisCode = RedisUtils.INSTANCE.get(SystemContents.USER_REG + ":" + phone);
        if (redisCode==null){
            return new AjaxResult("验证码失效");
        }
        //redis里面有验证码
        if (!code.equals(redisCode.split(":")[0])){
            return new AjaxResult("验证码错误");
        }
        /*
            1.用户已经注册过  和 wxUser 绑定到一起

            2.如果没有注册过 生成一个用户 再绑定
         */
        User user = userMapper.getByPhone(phone);
        if (user==null){
            user= new User();
            user.setPhone(phone);
            user.setState(1);
            userMapper.save(user);//返回新增数据的主键
        }

        //微信用户
        //根据openid 获取微信的用户信息
        WxUser wxUser =wxUserMapper.queryByOpenId(openid);
        if(wxUser==null){
            //去微信 获取用户的个人信息
            String userInfoStr = HttpClientUtils.httpGet(WxConfig.GET_USERINFO_URL.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid));
            //转换为JsonObject对象
            JSONObject userInfo = JSONObject.parseObject(userInfoStr);
            wxUser = new WxUser();
            wxUser.setOpenid(openid);
            wxUser.setNickname(userInfo.getString("nickname"));
            wxUser.setSex(userInfo.getInteger("sex"));
            wxUser.setHeadimgurl(userInfo.getString("headimgurl"));
            wxUser.setUnionid(userInfo.getString("unionid"));
            wxUser.setUser(user);
            wxUserMapper.save(wxUser);
            //跳转到用户的绑定页面
        }
        if (wxUser.getUser()==null){//用户使用微信登录过一次，没有绑定用户
            wxUser.setUser(user);
            wxUserMapper.update(wxUser);
        }

        //登录罗 并且跳转到首页


        String token = UUID.randomUUID().toString().replace('-', 'o');
        //java 对象  和 js  json对象如果可以转换
        String userJson = JSONObject.toJSONString(user);

        //需要把当前的登录用户存储到redis
        RedisUtils.INSTANCE.set(token,userJson,60*30);
        System.out.println("存储到redis里面的用户："+token+"       "+userJson);

        //把票据 和 用户都给前端服务器
        Map<String,Object> returnMap = new HashMap<>();
        returnMap.put("token",token);
        returnMap.put("user",user);
        return AjaxResult.me().setResultObj(returnMap);

    }
}
